// Algoritmo de Monte Carlo Sequencial
#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
#include <time.h>

main() {
	//declaração das variaveis
	int i,n = 25000; //n numero de iteraçãoes
	double x;
	double y;
	time_t inicio, fim; // variaveis de tempo
	double tempo; //fim-inicio
	FILE *fp;

	fp= fopen("pi_sequencial.txt","w");
	
	time(&inicio);// registra tempo ao iniciar o programa

	// precisão para utilização dos valores da gmp
	mpf_set_default_prec(33219280);	
	
	//declaração das variaveis gmp
	mpf_t ptotal;
	mpf_t pin;
	mpf_t valor_pi;

	//inicialização das variaveis gmp
	mpf_init (ptotal);
	mpf_init (pin);
	mpf_init (valor_pi);
	mpf_set_ui(pin,0);// pin=0

	// semente para função drand48 que gera numeros aleatórios entre 0 e 1
     	srand48(time(NULL));

	for(i=1;i<=n;i++){
		// ponto aleatório P(x,y) entre 0 e 1
		x=drand48();
		y=drand48();
		printf("  \n%d...",i);
		if((x*x+y*y)<=1) //x²+y² <= 1 
			// Pin é incrementado se P(x,y) estiver no interior do quarto de circulo
			mpf_add_ui(pin,pin,1); //pin=pin+1; pin são os pontos q ficam na regiao do circulo
       	
	}
   printf("Aguarde...\n");
	//ptotal são os pontos totais escolhidos
	mpf_set_ui(ptotal,i);

	//valor_pi= 4*(pin/ptotal) de acordo com Monte Carlo;
	mpf_div(valor_pi,pin,ptotal); //valor_pin=pin/ptotal
	mpf_mul_ui(valor_pi,valor_pi,4);//valor_pin=4*valor_pi
	

	time(&fim);// fim da execução do algoritmo
	
	// tempo de execução
	tempo=difftime(fim, inicio);

	//salvando em arquivo Pi com 10 milhões de casas.
	gmp_fprintf(fp,"%.10000000Ff",valor_pi);
	fclose(fp);
	
	printf("\nDemonstracao de apenas 100 casas decimais:");
    	gmp_printf("\npi = %.100Ff\n",valor_pi);
	printf("\nAs 10 milhoes de casas foram gerados no arquivo .txt");
	
	printf("\n\nTempo de execucao %lf segundos\n",tempo);
	
	//libera memoria	
	mpf_clear(pin);
	mpf_clear(ptotal);
	mpf_clear(valor_pi);
	
	
	
}
